package thread;

import java.util.concurrent.TimeUnit;

/**
 * 中断方法详解：
 */
public class ThreadInterrupt {

    /**
     * 打断处于阻塞状态的线程：
     * 比如【sleep】、【wait】、【join】等方法。
     * 会抛出异常【InterruptedException】，并且，会清空打断标记。
     * @throws InterruptedException
     */
    private static void test1() throws InterruptedException {
        Thread t1 = new Thread(()->{
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t1");
        t1.start();
        Thread.sleep(500);
        //主线程，打断t1线程。会出现异常，并将打断状态，置为false。
        t1.interrupt();
        System.out.println("t1线程的状态为："+t1.isInterrupted());
    }


    /**
     * 打断非阻塞状态的线程：
     *  不会抛出异常，并且会将打断状态设置为 true。
     * @throws InterruptedException
     */
    private static void test2() throws InterruptedException {
        Thread t1 = new Thread(()->{
            while (true){
                //模拟一个一直运行的线程。

                //如果想要通过打断机制中止一个线程，需要下面这几步。
                boolean interrupted = Thread.currentThread().isInterrupted();
                if(interrupted){
                    System.out.println(Thread.currentThread().getName()+"被打断了，自己中止这个线程");
                    break;
                }
            }
        },"t1");
        t1.start();
        Thread.sleep(500);
        //主线程，打断t1线程。这个仅仅是将打断状态设置为 true，不会中止t1线程的。
        t1.interrupt();
        System.out.println("t1线程的状态为："+t1.isInterrupted());
    }



}
